home *** CD-ROM | disk | FTP | other *** search
- /* fstream.h -- class filebuf and fstream declarations
-
- Copyright 1991, 1993 by TauMetric Corporation ALL RIGHTS RESERVED
-
- @(#)fstream.h 1.4 5/28/93 11:52:41
- */
- #ifndef _FSTREAM_H_
- #define _FSTREAM_H_
-
- #ifndef __cplusplus
- #error Use C++ compiler for fstream.h
- #endif
-
- #include <iostream.h>
-
- #pragma pack(__DEFALIGN)
- class filebuf : public streambuf {
- public:
- static const int openprot; // default file protection
- static const int sh_compat;
- static const int sh_none;
- static const int sh_read;
- static const int sh_write;
-
- // options for setmode member function
- static const int binary;
- static const int text;
-
- // constructors, destructor
- filebuf(); // make a closed filebuf
- filebuf(int); // make a filebuf attached to fd
- filebuf(int, char*, int); // same, with specified buffer
- ~filebuf();
-
- int is_open(); // is the file open
- int fd(); // what is the file descriptor
-
- // open named file with mode and protection, attach to this filebuf
- filebuf* open(const char*, int, int = filebuf::openprot);
-
- filebuf* close(); // flush and close file
- int setmode(int = filebuf::text);
- filebuf* attach(int); // attach this filebuf to opened file descriptor
- int detach(); // detach from and return the file descriptor
-
- /*
- * These perform the streambuf functions on a filebuf
- * Get and Put pointers are kept together
- */
- virtual int overflow(int = EOF);
- virtual int underflow();
- virtual int sync();
- virtual streampos seekoff(streamoff, ios::seek_dir, int);
- virtual streambuf* setbuf(char*, int);
-
- protected:
- int xfd; // the file descriptor, EOF if closed
- int mode; // the opened mode
- short opened; // non-zero if file is open
-
- streampos last_seek; // unused ***
- char* in_start; // unused ***
-
- int last_op(); // unused ***
- char lahead[2]; // current input char if unbuffered ***
- };
- /*
- * The data members marked with *** above are not documented in the AT&T
- * release of streams, so we cannot guarantee compatibility with any
- * other streams release in the use or values of these data members.
- * If you can document any expected behavior of these data members, we
- * will try to adjust our implementation accordingly.
- */
- inline int filebuf::is_open() { return opened; }
- inline int filebuf::fd() { return xfd; }
-
-
- class fstreambase : virtual public ios {
- public:
- fstreambase();
- fstreambase(const char*, int, int = filebuf::openprot);
- fstreambase(int);
- fstreambase(int _f, char*, int);
- ~fstreambase();
-
- void open(const char*, int, int = filebuf::openprot);
- void attach(int);
- void close();
- void setbuf(char*, int);
- filebuf* rdbuf();
- int setmode(int mode = filebuf::text) {return rdbuf()->setmode(mode);}
-
- protected:
- void verify(int); // unimplemented ***
-
- private:
- filebuf buf;
- };
- /*
- * The function member marked with *** above is not documented in the AT&T
- * release of streams, so we cannot guarantee compatibility with any
- * other streams release in its use.
- * If you can document any expected behavior of this function member, we
- * will try to adjust our implementation accordingly.
- */
- inline filebuf* fstreambase::rdbuf() { return &buf; }
-
-
- class ifstream : public fstreambase, public istream {
- public:
- ifstream();
- ifstream(const char*, int=ios::in, int=filebuf::openprot);
- ifstream(int);
- ifstream(int, char*, int);
- ~ifstream();
-
- filebuf* rdbuf();
-
- int is_open(){ return rdbuf()->is_open(); }
- void open(const char*, int=ios::in, int=filebuf::openprot);
- void close();
- };
- inline filebuf* ifstream::rdbuf() { return fstreambase::rdbuf(); }
- inline void ifstream::open(const char* _n, int _m, int _p)
- { fstreambase::open(_n, _m | ios::in, _p); }
- inline void ifstream::close()
- { fstreambase::close(); }
-
-
-
- class ofstream : public fstreambase, public ostream {
- public:
- ofstream();
- ofstream(const char*, int=ios::out, int=filebuf::openprot);
- ofstream(int);
- ofstream(int _f, char*, int);
- ~ofstream();
-
- filebuf* rdbuf();
-
- int is_open(){ return rdbuf()->is_open(); }
- void open(const char*, int=ios::out, int=filebuf::openprot);
- void close();
- };
- inline filebuf* ofstream::rdbuf() { return fstreambase::rdbuf(); }
- inline void ofstream::open(const char* name, int m, int prot)
- { fstreambase::open(name, m | ios::out, prot); }
- inline void ofstream::close()
- { fstreambase::close(); }
-
-
-
- class fstream : public fstreambase, public iostream {
- public:
- fstream();
- fstream(const char*, int, int = filebuf::openprot);
- fstream(int);
- fstream(int _f, char*, int);
- ~fstream();
-
- filebuf* rdbuf();
-
- int is_open(){ return rdbuf()->is_open(); }
- void open(const char *, int, int = filebuf::openprot);
- void close();
- };
- inline filebuf* fstream::rdbuf() { return fstreambase::rdbuf(); }
- inline void fstream::open(const char* name, int m, int prot)
- { fstreambase::open(name, m, prot); }
- inline void fstream::close()
- { fstreambase::close(); }
-
- inline ios& binary(ios& st) {((filebuf*)st.rdbuf())->setmode(filebuf::binary); return st;}
- inline ios& text(ios& st) {((filebuf*)st.rdbuf())->setmode(filebuf::text); return st;}
-
- #pragma pack()
-
- #endif /* _FSTREAM_H_ */
-